www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/LTE_check_parameters.m
% 检查参数组合配置是否满足要求 计算其他非独立参数 % 非独立运行脚本文件,请从LTE_main_gui_final 运行 % % Author: 程式小组(徐萌 张妙 张晓庆) % Date: 2010-06-20 % ========================================================== %其他原始输入检查见 LTE_load_parameter load TransblockPar.mat % 载入可用的TB0矩阵配置 % 一个PRB内导频占用的资源粒子数 % 举例 rsNum(CFI,nTx)表示控制符号数为CFI,天线数为nTx时, % 属于PDSCH的每个PRB内导频占用的个数,不存在3天线情况,此处全0 rsNum = [6 12 0 20; 6 12 0 16; 6 12 0 16]; % 每个资源块包含的子载波数 LTE_par.scPerRB = 12; % 根据CP类型确定OFDM符号数 if strcmp(LTE_par.cyclicPrefix,'normal') LTE_par.nOfdmSymb = 14; end % 根据带宽确定CP以及FFT点数 if LTE_par.sysBand == 10000000 LTE_par.RB_DL = 50; LTE_par.FFT_SIZE = 1024; LTE_par.CP = [80 72 72 72 72 72 72 80 72 72 72 72 72 72]; elseif LTE_par.sysBand == 20000000 LTE_par.RB_DL = 100; LTE_par.FFT_SIZE = 2048; LTE_par.CP = [160 144 144 144 144 144 144 160 144 144 144 144 144 144]; end % 根据用户数及每用户的PRB分配情况,检查是否超出系统带宽 applyPRB = 0; for iUE = 1:LTE_par.nUE if LTE_par.UE_par.nRB(iUE) < 1 errNum = errNum+1; errorMsg{errNum} = 'ERROR: 为用户分配总带宽不能为0或负数'; errNum = errNum+1; errorMsg{errNum} = 'HINT:系统可用物理资源数 {20MHz带宽:100PRB 10MHz带宽:50PRB}'; end applyPRB = applyPRB+LTE_par.UE_par.nRB(iUE); end if applyPRB > LTE_par.RB_DL errNum = errNum+1; errorMsg{errNum} = 'ERROR: 为用户分配总带宽超过系统可用带宽'; errNum = errNum+1; errorMsg{errNum} = 'HINT:用户数乘以物理资源数不大于系统可用物理资源数 {20MHz带宽:100PRB 10MHz带宽:50PRB}'; end % 预处理 传输模式检查 preProcess = LTE_par.UE_par.preProcess; if strcmp(preProcess,'singleAnt') if LTE_par.UE_par.transMod > 1 && LTE_par.UE_par.transMod < 7 errNum = errNum+1; errorMsg{errNum} = 'ERROR: 预处理方式和传输模式不匹配'; errNum = errNum+1; errorMsg{errNum} = 'HINT:修改传输模式为1或改变预处理方式 传输模式2对应预处理:Diversity 传输模式3-6对应预处理:Multiplex'; end elseif strcmp(preProcess,'spatialMultiplexing') if LTE_par.UE_par.transMod == 1 || LTE_par.UE_par.transMod == 2 || LTE_par.UE_par.transMod == 7 errNum = errNum+1; errorMsg{errNum} = 'ERROR: 预处理方式和传输模式不匹配'; errNum = errNum+1; errorMsg{errNum} = 'HINT:修改传输模式为3-6或改变预处理方式 传输模式1和7对应预处理:singleAnt 传输模式2对应预处理:Diversity'; end elseif strcmp(preProcess,'tranmitDiversity') if LTE_par.UE_par.transMod ~= 2 errNum = errNum+1; errorMsg{errNum} = 'ERROR: 预处理方式和传输模式不匹配'; errNum = errNum+1; errorMsg{errNum} = 'HINT:修改传输模式为2或改变预处理方式 传输模式1和7对应预处理:singleAnt 传输模式3-6对应预处理:Multiplex'; end end % 预处理模式 码字数 层数 天线端口数检查 nTx = LTE_par.BS_par.nAnt; if strcmp(preProcess,'singleAnt') for iUE = 1:LTE_par.nUE nCW = LTE_par.UE_par.nCW(iUE); nLayer = LTE_par.UE_par.nLayer(iUE); if nCW+nLayer+nTx ~= 3 % 三个参数有一个不为1(三个参数最小值为1) str = sprintf('ERROR:第 %d 个用户 码字数-层数-发端天线数 不匹配',iUE); errNum = errNum+1; errorMsg{errNum} = str; errNum = errNum+1; errorMsg{errNum} = 'HINT:码字数 层数 发端天线数在单天线下有效配置为{1-1-1}'; end end elseif strcmp(preProcess,'spatialMultiplexing') for iUE = 1:LTE_par.nUE nCW = LTE_par.UE_par.nCW(iUE); nLayer = LTE_par.UE_par.nLayer(iUE); PMI = LTE_par.UE_par.PMI(iUE); if LTE_par.BS_par.nAnt == 2 if PMI < 0 || PMI > 3 str = sprintf('ERROR:第 %d 个用户 PMI 配置错误',iUE); errNum = errNum+1; errorMsg{errNum} = str; errNum = errNum+1; errorMsg{errNum} = 'HINT:2Tx下 PMI为0-3'; end elseif LTE_par.BS_par.nAnt == 4 if PMI < 0 || PMI > 15 str = sprintf('ERROR:第 %d 个用户 PMI 配置错误',iUE); errNum = errNum+1; errorMsg{errNum} = str; errNum = errNum+1; errorMsg{errNum} = 'HINT:4Tx下 PMI为0-15'; end end if ( nCW == 1 && nLayer > 2) || ( nCW > nLayer) || (nLayer > nTx) || nTx == 1 str = sprintf('ERROR:第 %d 个用户 码字数-层数-发端天线数 不匹配',iUE); errNum = errNum+1; errorMsg{errNum} = str; errNum = errNum+1; errorMsg{errNum} = 'HINT:复用下有效配置为{ 1-1-P 2-2-P 2-2-P 2-3-P 2-4-P | P大于2且大于等于第二个数}'; end % CDD中的特例检查 if LTE_par.UE_par.transMod == 3 if nCW == 1 || nLayer == 1 str = sprintf('ERROR:第 %d 个用户 CDD模式下码字数不能为1',iUE); errNum = errNum+1; errorMsg{errNum} = str; errNum = errNum+1; errorMsg{errNum} = 'HINT:CDD模式下码字数应为2'; end if LTE_par.recEnalbe == true errNum = errNum+1; errorMsg{errNum} = 'ERROR:CDD模式仅实现发端,收端暂时未对其检测'; errNum = errNum+1; errorMsg{errNum} = 'HINT:请选择其他模式,收端可实现'; end end % MU-MIMO中的特例检查 if LTE_par.UE_par.transMod == 5 if LTE_par.nUE < 2 errNum = errNum+1; errorMsg{errNum} = 'ERROR:MU-MIMO模式下,UE数小于2'; errNum = errNum+1; errorMsg{errNum} = 'HINT:MU-MIMO模式下,UE数目不能小于2,UE1和UE2分配相同的子带'; end end end elseif strcmp(preProcess,'tranmitDiversity') for iUE = 1:LTE_par.nUE nCW = LTE_par.UE_par.nCW(iUE); nLayer = LTE_par.UE_par.nLayer(iUE); if ( nCW == 1 && nLayer == 1) || ( nCW == 1 && nLayer == 3) || ( nCW ~= 1 ) || (nLayer ~= nTx) str = sprintf('ERROR:第 %d 个用户 码字数-层数-发端天线数 不匹配',iUE); errNum = errNum+1; errorMsg{errNum} = str; errNum = errNum+1; errorMsg{errNum} = 'HINT:复用下有效配置为{ 1-2-P 1-4-4 | P大于等于第二个数}'; end end end if strcmp(LTE_par.setpar,'loadPar') % ================== % 载入参数模式下 参数检查部分 =============== % 检查KMIMO if LTE_par.UE_par.transMod == 3 || LTE_par.UE_par.transMod == 4 if LTE_par.UE_par.KMIMO == 2; else errNum = errNum+1; errorMsg{errNum} = 'ERROR:KMIMO 取值不合法'; errNum = errNum+1; errorMsg{errNum} = 'HINT:KMIMO在传输模式3或4下,取值为2。其他情况取值为1'; end else if LTE_par.UE_par.KMIMO == 1 else errNum = errNum+1; errorMsg{errNum} = 'ERROR:KMIMO 取值不合法'; errNum = errNum+1; errorMsg{errNum} = 'HINT:KMIMO在传输模式3或4下,取值为2。其他情况取值为1'; end end % 检查TB是否和IMCS NRB对应 nUE = LTE_par.nUE; nRB = LTE_par.UE_par.nRB(1); IMCS = LTE_par.UE_par.IMCS(1); Qm = LTE_par.UE_par.Qm(1); if IMCS<=9 ITBS = IMCS; mary = 2; elseif IMCS<=16 ITBS = IMCS-1; mary = 4; else ITBS = IMCS-2; mary = 6; end if mary ~= Qm str = sprintf('HINT:当IMCS为 %d 时,调制方式应取 %d {2:QPSK 4:16QAM 6:64QAM} 详细取值参见36.213 V8.7.0 section 7.1.7.2.1',IMCS,mary); errNum = errNum+1; errorMsg{errNum} = 'ERROR:调制方式选择错误'; errNum = errNum+1; errorMsg{errNum} = str; end LTE_par.UE_par.ITBS(1,1) = ITBS; % 可能未用到该参数 sizeTB0 = transBlockSize(ITBS+1,nRB); if sizeTB0 ~=LTE_par.UE_par.sizeTB(1) errNum = errNum+1; errorMsg{errNum} = 'ERROR:TB0 取值不合法'; errNum = errNum+1; errorMsg{errNum} = 'HINT:TB0 取值参见36.213 V8.7.0 section 7.1.7.2.1'; end elseif strcmp(LTE_par.setpar,'manuPar') % ================== % 手动配置参数模式下 参数检查 非独立参数确定 =============== % 根据传输模式确定 KMIMO if LTE_par.UE_par.transMod == 3 || LTE_par.UE_par.transMod == 4 LTE_par.UE_par.KMIMO = 2; else LTE_par.UE_par.KMIMO = 1; end % 根据发端天线数,控制格式指示,确定资源粒子数 % 根据调制编码序号,确定传输块大小,调制方式 CFI = LTE_par.CFI; nTx = LTE_par.BS_par.nAnt; scPerRB = LTE_par.scPerRB; nOfdmSymb = LTE_par.nOfdmSymb; for iUE = 1:LTE_par.nUE nCW = LTE_par.UE_par.nCW(iUE); nLayer = LTE_par.UE_par.nLayer(iUE); nRB = LTE_par.UE_par.nRB(iUE); % nRE表示子带内每个天线上可用于PDSCH传输数据符号的个数 LTE_par.UE_par.nRE(iUE) = nRB*((nOfdmSymb-CFI)*scPerRB-rsNum(CFI,nTx)); % 码字0调制符号数 LTE_par.UE_par.M_0_SYMB(iUE) = nRB*((nOfdmSymb-CFI)*scPerRB-rsNum(CFI,nTx)); if nCW == 2 && nLayer == 4 LTE_par.UE_par.M_0_SYMB(iUE) = 2*nRB*((nOfdmSymb-CFI)*scPerRB-rsNum(CFI,nTx)); end for iTB = 1:LTE_par.UE_par.nCW(iUE) IMCS = LTE_par.UE_par.IMCS(iTB,iUE); if IMCS<0 || IMCS > 28 str = sprintf('ERROR:第 %d 个用户 IMCS超出范围',iUE); errNum = errNum+1; errorMsg{errNum} = str; errNum = errNum+1; errorMsg{errNum} = 'HINT:IMCS有效取值为0-28'; else if IMCS<=9 ITBS = IMCS; Qm = 2; elseif IMCS<=16 ITBS = IMCS-1; Qm = 4; else ITBS = IMCS-2; Qm = 6; end sizeTB = transBlockSize(ITBS+1,nRB); LTE_par.UE_par.sizeTB(iTB,iUE) = sizeTB; LTE_par.UE_par.Qm(iTB,iUE) = Qm; end end end end % 参数错误统计 if errNum ~= 1 str = sprintf('参数配置错误个数为: %d',(errNum-1)/2); errorMsg{1} = str; LTE_par.errFlag = true; % 参数配置错误 else LTE_par.errFlag = false; % 参数配置正确 end % LTE_par.UE_par.decodeAlg = 1; % 解码算法 0:Log-Map算法 1:MAX-Log-Map算法 2:Sova算法 LTE_par.UE_par.niter = 8; % turbo译码迭代次数 LTE_par.carrBand = 15000; % 每个子载波带宽 % LTE_par.addNoise = true; % LTE_par.detecAlg = 'MMSE';